Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / meshchatx / src / backend / memory_pressure.py

Displaying Raw • Download


meshchatx/src/backend/memory_pressure.py b0d47b9ece2aac27f9b52d71eead961754287bf5 (b0d47b9e) Text, 6.79 KB

T8b949e# SPDX-License-Identifier: 0BSD

T8b949e"""Periodic and pressure-triggered memory cleanup for MeshChatX."""

Tff7b72from T7ee787__future__ Tff7b72import Te6edf3annotations

Tff7b72import T7ee787logging
Tff7b72import T7ee787time
Tff7b72from T7ee787typing Tff7b72import Te6edf3Any

Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backend Tff7b72import Tb4b4b4(
Te6edf3nomadnet_downloaderTb4b4b4,
Te6edf3reticulum_pathfindingTb4b4b4,
Te6edf3rns_link_managerTb4b4b4,
Tb4b4b4)

Te6edf3_log Tff7b72= Te6edf3loggingTff7b72.Td2a8ffgetLoggerTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.memory_pressureTa5d6ff"Tb4b4b4)

Te6edf3HELD_ANNOUNCES_DROP_THRESHOLD Tff7b72= T79c0ff512
Te6edf3ANNOUNCE_CACHE_CLEAN_INTERVAL_S Tff7b72= T79c0ff30 Tff7b72* T79c0ff60


Tff7b72def Td2a8ff_app_flagTb4b4b4(Te6edf3appTb4b4b4: Te6edf3AnyTb4b4b4, Te6edf3nameTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
T8b949e"""Read a boolean flag without treating MagicMock defaults as True."""
Tff7b72if Te6edf3app Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72tryTb4b4b4:
Tff7b72return Tffa657boolTb4b4b4(Tffa657objectTff7b72.Td2a8ff__getattribute__Tb4b4b4(Te6edf3appTb4b4b4, Te6edf3nameTb4b4b4)Tb4b4b4)
Tff7b72except Tf85149AttributeErrorTb4b4b4:
Tff7b72return Tff7b72False


Tff7b72class T56d364MemoryPressureManagerTb4b4b4:
T8b949e"""Coordinates link sweeps, path pruning, and SQLite disk offload."""

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3appTb4b4b4: Te6edf3Any Tff7b72= Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffapp Tff7b72= Te6edf3app
Tff7b72selfTff7b72.Td2a8ff_last_announce_cache_clean Tff7b72= T79c0ff0.0
Tff7b72selfTff7b72.Td2a8ff_sqlite_relaxed Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8fflast_statsTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4] Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnomad_links_sweptTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffrns_links_sweptTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffpaths_pruned_expiredTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffpaths_pruned_capTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffannounce_cache_cleanedTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Ta5d6ff"Ta5d6ffheld_queues_droppedTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Ta5d6ff"Ta5d6ffsqlite_relaxedTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Tb4b4b4}

Tff7b72def Td2a8ffrun_periodic_cleanupTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
T8b949e"""Called from announce_loop about every 5 minutes."""
Te6edf3reticulum Tff7b72= Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4) Tff7b72if Tff7b72selfTff7b72.Td2a8ffapp Tff7b72else Tff7b72None

Te6edf3before_nomad Tff7b72= Te6edf3nomadnet_downloaderTff7b72.Td2a8ffcached_link_countTb4b4b4(Tb4b4b4)
Te6edf3nomadnet_downloaderTff7b72.Td2a8ffsweep_stale_linksTb4b4b4(Tb4b4b4)
Te6edf3after_nomad Tff7b72= Te6edf3nomadnet_downloaderTff7b72.Td2a8ffcached_link_countTb4b4b4(Tb4b4b4)

Te6edf3before_rns Tff7b72= Te6edf3rns_link_managerTff7b72.Td2a8ffcached_link_countTb4b4b4(Tb4b4b4)
Te6edf3rns_link_managerTff7b72.Td2a8ffsweep_stale_linksTb4b4b4(Tb4b4b4)
Te6edf3after_rns Tff7b72= Te6edf3rns_link_managerTff7b72.Td2a8ffcached_link_countTb4b4b4(Tb4b4b4)

Te6edf3expired_dropped Tff7b72= Te6edf3reticulum_pathfindingTff7b72.Td2a8ffprune_expired_path_table_entriesTb4b4b4(
Te6edf3reticulumTb4b4b4,
Tb4b4b4)
Te6edf3cap_dropped Tff7b72= Te6edf3reticulum_pathfindingTff7b72.Td2a8ffprune_path_table_to_soft_capTb4b4b4(Te6edf3reticulumTb4b4b4)

Te6edf3announce_cleaned Tff7b72= Tff7b72False
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3now Tff7b72- Tff7b72selfTff7b72.Td2a8ff_last_announce_cache_clean Tff7b72>Tff7b72= Te6edf3ANNOUNCE_CACHE_CLEAN_INTERVAL_STb4b4b4:
Te6edf3announce_cleaned Tff7b72= Te6edf3reticulum_pathfindingTff7b72.Td2a8ffclean_rns_announce_cacheTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3announce_cleanedTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_last_announce_cache_clean Tff7b72= Te6edf3now

Te6edf3held_dropped Tff7b72= Tff7b72selfTff7b72.Td2a8ff_maybe_drop_held_announce_queuesTb4b4b4(Tb4b4b4)

Tff7b72selfTff7b72.Td2a8fflast_stats Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnomad_links_sweptTa5d6ff"Tb4b4b4: Tffa657maxTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3before_nomad Tff7b72- Te6edf3after_nomadTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffrns_links_sweptTa5d6ff"Tb4b4b4: Tffa657maxTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3before_rns Tff7b72- Te6edf3after_rnsTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffnomad_cached_linksTa5d6ff"Tb4b4b4: Te6edf3after_nomadTb4b4b4,
Ta5d6ff"Ta5d6ffrns_cached_linksTa5d6ff"Tb4b4b4: Te6edf3after_rnsTb4b4b4,
Ta5d6ff"Ta5d6ffpaths_pruned_expiredTa5d6ff"Tb4b4b4: Te6edf3expired_droppedTb4b4b4,
Ta5d6ff"Ta5d6ffpaths_pruned_capTa5d6ff"Tb4b4b4: Te6edf3cap_droppedTb4b4b4,
Ta5d6ff"Ta5d6ffpath_table_sizeTa5d6ff"Tb4b4b4: Te6edf3reticulum_pathfindingTff7b72.Td2a8ffpath_table_sizeTb4b4b4(Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffannounce_cache_cleanedTa5d6ff"Tb4b4b4: Te6edf3announce_cleanedTb4b4b4,
Ta5d6ff"Ta5d6ffheld_queues_droppedTa5d6ff"Tb4b4b4: Te6edf3held_droppedTb4b4b4,
Ta5d6ff"Ta5d6ffsqlite_relaxedTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_sqlite_relaxedTb4b4b4,
Tb4b4b4}
Tff7b72if Tb4b4b4(
Te6edf3expired_dropped
Tff7b72or Te6edf3cap_dropped
Tff7b72or Te6edf3announce_cleaned
Tff7b72or Te6edf3held_dropped
Tff7b72or Te6edf3before_nomad Tff7b72!= Te6edf3after_nomad
Tff7b72or Te6edf3before_rns Tff7b72!= Te6edf3after_rns
Tb4b4b4)Tb4b4b4:
Te6edf3_logTff7b72.Td2a8ffinfoTb4b4b4(Ta5d6ff"Ta5d6ffMemory cleanup: Tffd700%sTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8fflast_statsTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8fflast_stats

Tff7b72def Td2a8ffon_memory_lowTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3available_mbTb4b4b4: Tffa657floatTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
T8b949e"""Reactive cleanup when HealthMonitor reports low available RAM."""
Te6edf3stats Tff7b72= Tff7b72selfTff7b72.Td2a8ffrun_periodic_cleanupTb4b4b4(Tb4b4b4)
Te6edf3db Tff7b72= Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Ta5d6ff"Ta5d6ffdatabaseTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4) Tff7b72if Tff7b72selfTff7b72.Td2a8ffapp Tff7b72else Tff7b72None
Tff7b72if Te6edf3db Tff7b72is Tff7b72not Tff7b72None Tff7b72and Tffa657hasattrTb4b4b4(Te6edf3dbTb4b4b4, Ta5d6ff"Ta5d6ffapply_memory_pressure_pragmasTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3fs_sandbox_active Tff7b72= Tb4b4b4(
Te6edf3_app_flagTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Ta5d6ff"Ta5d6fffs_sandbox_activeTa5d6ff"Tb4b4b4)
Tff7b72or Te6edf3_app_flagTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffappTb4b4b4,
Ta5d6ff"Ta5d6fflandlock_activeTa5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72or Te6edf3_app_flagTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Ta5d6ff"Ta5d6ffappcontainer_activeTa5d6ff"Tb4b4b4)
Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffapply_memory_pressure_pragmasTb4b4b4(
Tff7b72TrueTb4b4b4,
Te6edf3fs_sandbox_activeTff7b72=Te6edf3fs_sandbox_activeTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_sqlite_relaxed Tff7b72= Tff7b72True
Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6ffsqlite_relaxedTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72True
Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6ffsqlite_file_tempTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72not Te6edf3fs_sandbox_active
Tff7b72except Tf85149Exception Tff7b72as Te6edf3excTb4b4b4:
Te6edf3_logTff7b72.Td2a8ffdebugTb4b4b4(Ta5d6ff"Ta5d6ffSQLite pressure pragmas failed: Tffd700%sTa5d6ff"Tb4b4b4, Te6edf3excTb4b4b4)
Te6edf3_logTff7b72.Td2a8ffwarningTb4b4b4(
Ta5d6ff"Ta5d6ffMemory pressure cleanup (available=Tffd700%.0fTa5d6ff MB): Tffd700%sTa5d6ff"Tb4b4b4,
Te6edf3available_mbTb4b4b4,
Te6edf3statsTb4b4b4,
Tb4b4b4)
Tff7b72return Te6edf3stats

Tff7b72def Td2a8ffon_memory_recoveredTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_sqlite_relaxedTb4b4b4:
Tff7b72return
Te6edf3db Tff7b72= Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Ta5d6ff"Ta5d6ffdatabaseTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4) Tff7b72if Tff7b72selfTff7b72.Td2a8ffapp Tff7b72else Tff7b72None
Tff7b72if Te6edf3db Tff7b72is Tff7b72not Tff7b72None Tff7b72and Tffa657hasattrTb4b4b4(Te6edf3dbTb4b4b4, Ta5d6ff"Ta5d6ffapply_memory_pressure_pragmasTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3dbTff7b72.Td2a8ffapply_memory_pressure_pragmasTb4b4b4(Tff7b72FalseTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_sqlite_relaxed Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8fflast_statsTb4b4b4[Ta5d6ff"Ta5d6ffsqlite_relaxedTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72False
Tff7b72except Tf85149Exception Tff7b72as Te6edf3excTb4b4b4:
Te6edf3_logTff7b72.Td2a8ffdebugTb4b4b4(Ta5d6ff"Ta5d6ffSQLite restore pragmas failed: Tffd700%sTa5d6ff"Tb4b4b4, Te6edf3excTb4b4b4)

Tff7b72def Td2a8ff_maybe_drop_held_announce_queuesTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffapp Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72False
Te6edf3handler Tff7b72= Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Ta5d6ff"Ta5d6ffrnpath_handlerTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72if Te6edf3handler Tff7b72is Tff7b72None Tff7b72or Tff7b72not Tffa657hasattrTb4b4b4(Te6edf3handlerTb4b4b4, Ta5d6ff"Ta5d6ffdrop_announce_queuesTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False
Te6edf3held Tff7b72= Tff7b72selfTff7b72.Td2a8ff_count_held_announcesTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3held Tff7b72< Te6edf3HELD_ANNOUNCES_DROP_THRESHOLDTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72tryTb4b4b4:
Te6edf3handlerTff7b72.Td2a8ffdrop_announce_queuesTb4b4b4(Tb4b4b4)
Te6edf3_logTff7b72.Td2a8ffinfoTb4b4b4(Ta5d6ff"Ta5d6ffDropped announce queues (held_announces=Tffd700%sTa5d6ff)Ta5d6ff"Tb4b4b4, Te6edf3heldTb4b4b4)
Tff7b72return Tff7b72True
Tff7b72except Tf85149Exception Tff7b72as Te6edf3excTb4b4b4:
Te6edf3_logTff7b72.Td2a8ffdebugTb4b4b4(Ta5d6ff"Ta5d6ffdrop_announce_queues failed: Tffd700%sTa5d6ff"Tb4b4b4, Te6edf3excTb4b4b4)
Tff7b72return Tff7b72False

Tff7b72def Td2a8ff_count_held_announcesTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657intTb4b4b4:
Te6edf3total Tff7b72= T79c0ff0
Tff7b72tryTb4b4b4:
Te6edf3held Tff7b72= Tffa657getattrTb4b4b4(
Tffa657__import__Tb4b4b4(Ta5d6ff"Ta5d6ffRNSTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffTransportTb4b4b4,
Ta5d6ff"Ta5d6ffheld_announcesTa5d6ff"Tb4b4b4,
Tff7b72NoneTb4b4b4,
Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3heldTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Te6edf3total Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3heldTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Tff7b72tryTb4b4b4:
Tff7b72import T7ee787RNS

Te6edf3interfaces Tff7b72= Tffa657getattrTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4) Tff7b72or Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3iface Tff7b72in Te6edf3interfacesTb4b4b4:
Te6edf3iface_held Tff7b72= Tffa657getattrTb4b4b4(Te6edf3ifaceTb4b4b4, Ta5d6ff"Ta5d6ffheld_announcesTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3iface_heldTb4b4b4, Tffa657dictTb4b4b4) Tff7b72or Tffa657isinstanceTb4b4b4(
Te6edf3iface_heldTb4b4b4, Tb4b4b4(Tffa657listTb4b4b4, Tffa657setTb4b4b4, Tffa657tupleTb4b4b4)
Tb4b4b4)Tb4b4b4:
Te6edf3total Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3iface_heldTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Tff7b72return Te6edf3total


Tff7b72def Td2a8ffcache_statsTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Tffa657intTb4b4b4]Tb4b4b4:
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffnomad_cached_linksTa5d6ff"Tb4b4b4: Te6edf3nomadnet_downloaderTff7b72.Td2a8ffcached_link_countTb4b4b4(Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffrns_cached_linksTa5d6ff"Tb4b4b4: Te6edf3rns_link_managerTff7b72.Td2a8ffcached_link_countTb4b4b4(Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffpath_table_sizeTa5d6ff"Tb4b4b4: Te6edf3reticulum_pathfindingTff7b72.Td2a8ffpath_table_sizeTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4}


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────